<?php
require_once 'UE/Cache/Abstract.php';
/**
 * APC扩展缓存实现
 * 
 * ============================================================================
 * 版权所有: (c) 2009-2011，<UEShop Inc>，并保留所有权利。
 * 网站地址: http://www.ueshop.cn
 * ----------------------------------------------------------------------------
 * 这不是一个自由软件！您只能在不用于商业目的的前提下对程序代码进行修改和使用；
 * 不允许对程序代码以任何形式任何目的的再发布。
 * ============================================================================
 * @author cmpan
 * @copyright   Copyright (c) 2009-2011 UEShop Inc. (http://www.ueshop.cn)
 * @license     http://www.ueshop.cn/1_0.txt
 */
class UE_Cache_Apc extends UE_Cache_Abstract {
	
	protected $_prefix = 'cache.ueshop.cn';
	
	public function __construct() {
		if (!function_exists('apc_cache_info')) {
			throw new UE_Cache_Exception('apc extension didn\'t installed');
		}
	}
	
	/**
	 * 保存缓存变量
	 *
	 * @param string $key
	 * @param mixed $value
	 * @return bool
	 */
	public function store($key, $value) {
	    return apc_store($this->_storageKey($key), $value);
	}
	
	/**
	 * 读取缓存
	 *
	 * @param string $key
	 * @return mixed
	 */
	public function fetch($key) {
	    return apc_fetch($this->_storageKey($key));
	}
	
	/**
	 * 清除缓存
	 *
	 * @return UE_Cache_Apc
	 */
	public function clear() {
		apc_clear_cache();
		return $this;
	}
	
	/**
	 * 删除缓存单元
	 *
	 * @return UE_Cache_Apc
	 */
	public function delete($key) {
	    apc_delete($this->_storageKey($key));
	    return $this;
	}
	
	/**
	 * 缓存单元是否被锁定
	 *
	 * @param string $key
	 * @return bool
	 */
	public function isLocked($key) {
		if ((apc_fetch($this->_storageKey($key) . '.lock')) === false) {
		    return false;
		}
		
		return true;
	}
	
	/**
	 * 锁定缓存单元
	 *
	 * @param string $key
	 * @return UE_Cache_Apc
	 */
	public function lock($key) {
		apc_store($this->_storageKey($key) . '.lock', '', 5);
		return $this;
	}
	
	/**
	 * 缓存单元解锁
	 *
	 * @param string $key
	 * @return UE_Cache_Apc
	 */
	public function unlock($key) {
		apc_delete($this->_storageKey($key) . '.lock');
		return $this;
	}
	
	/**
	 * 完整缓存名
	 *
	 * @param string $key
	 * @return string
	 */
	private function _storageKey($key) {
	    return $this->_prefix . '_' . $key;
	}
}
